/*
 * $AIST_Release: 0.9.0 $
 * Copyright 2011 Information Technology Research Institute, National
 * Institute of Advanced Industrial Science and Technology
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.scalatest.FunSuite

import aggr.Aggregators
import aggr.SerializedTypes._

class AggrCheckSuite extends FunSuite {

  sealed trait Result
  case object SUCCESS     extends Result
  case object FAILED      extends Result
  case object UNKOWN_AGGR extends Result

  def check(aggr: String, 
            keyType: SerializedType, 
            valType: SerializedType, 
            argsType: List[SerializedType], 
            options: Map[String, SerializedType]): Result = {
    Aggregators.aggrMap.get(aggr) match {
      case Some(f) => 
        f.check(keyType, valType, argsType, options) match {
          case Some(msgs) => FAILED
          case None       => SUCCESS
        } 
      case None => UNKOWN_AGGR
    }
  }
    
  test("BasicType table test") {
    val basicTypes = List(
      BoolType, FloatType, DoubleType, Fixed32Type, Fixed64Type, SFixed32Type, SFixed64Type,
      Int32Type, Int64Type, SInt32Type, SInt64Type, UInt32Type, UInt64Type, StringType,
      BytesType
    )

    for (t <- basicTypes) {
      assert(check("collection", StringType, t, List(), Map()) == SUCCESS)
    }
  }

  test("BasicType table test(sum)") {
    val numberTypes = List(
      FloatType, DoubleType, Fixed32Type, Fixed64Type, SFixed32Type, SFixed64Type,
      Int32Type, Int64Type, SInt32Type, SInt64Type, UInt32Type, UInt64Type
    )
    val notNumberTypes = List(BoolType, BytesType, StringType)

    for (t <- numberTypes) {
      assert(check("sum", StringType, t, List(), Map()) == SUCCESS)
    }

    for (t <- notNumberTypes) {
      assert(check("sum", StringType, t, List(), Map()) == FAILED)
    }
  }

  /* TODO: 複合型のテストを書く */
}
